﻿<%@ Page Title="" Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true"
    CodeFile="SimpleBinding.aspx.cs" Inherits="Lessons_SimpleBinding" %>

<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="Server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server">
    <link href="../Style/LessonsStyle.css" rel="stylesheet" type="text/css" />
    Binding в WPF<br />
    Съдържание:<br />
    <ul>
        <li>Защо ни е необходим data binding?</li>
        <li>Simple binding </li>
        <li>Binding class </li>
        <li>Data context</li>
        <li>Binding към други контоли</li>
        <li>Ваидация на данните</li>
        <li>Binding path syntax</li>
        <li>Релативни източници </li>
    </ul>
    <div>
        <p>
            Защо ни е необходим data binding?</p>
        <p>
            <span>Целта на почти всички приложения са показване на данни на потребителя и освен
                това възможнотс за редактиране да данните. Работата на разработчика е свързването
                на данни от различни източници в един. Чрез WPF енджина за байдване на данни разработчиците
                получават повече възможности и спестяване на писане на код. Дейта баиндинга е основна
                основна концепция в юзър интерфейс технологиите като WPF Голяма част от приложениета
                за Windows са ориентирани към визуалозирането на информация. </span>
        </p>
    </div>
    <div>
        <p>
            Simple binding</p>
        <p>
            <span>За да се позволи използването на simple binding трябва да се използват дев основнвни
                пропъртита за data binding енджина. Чрез тези основни пропъртита се улеснява работата
                на енджина да синхронизира данните от источника и получателя. </span>
        </p>
    </div>
    <div>
        <p>
            Binding class
        </p>
        <p>
            <span>Тези клалсове предоставят доста повевече възможности от колкото конвенционалните.
                Тук се отличават няколко основни свойства като напривмер:</span>
            <ul>
                <li>Converter - чрес това пропъти се конвертита стойността в подходящ формата за да
                    бъде показан правилно. </li>
                <li>ConverterParameter - Всички параметри преминават през интефейса IValueConverter.
                </li>
                <li>ElementName - Използва се когато източнитка на информация е UI елемент.</li>
                <li>Mode - Предоставя един от наите на свързване: TwoWay OneWay OneTime OneWay OneTime
                    OneWayToSource или Default</li>
                <li>Path - пътя до обекта в който се съдържат данните.</li>
                <li>Source - директна референция до източника на данни.</li>
            </ul>
            <span>Цел на този клас могат да бъдат всички WPF елементи но само тези които позволяват
                binding на елементи от dependency property.</span>
        </p>
    </div>
    <div>
        <p>
            Data context
        </p>
        <p>
            <span>В WPF всеки FrameworkElement и всеки FrameworkContentElement притежава DataContext
                пропърти. Ако не се коноретизира точен източник на данни чрез пропъртито Source,
                WPF за почва да търси елементи на горе по дървото започвайки от текущият елемент
                търсейки за някоие DataContext пропърти коеот да е сетнато. На проименр две контроли
                с един и същи родите могат да опрерират с един и същи източник на информация като
                предоставя едно и също валю за и за двата контрола. </span>XAML:
            <table border="1">
                <tbody>
                    <tr>
                        <td>
                            <div class="Code">
                                &lt;Window x:Class=&quot;DataContexts.DataContextsWindow&quot;<br />
                                xmlns=&quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&quot;<br />
                                xmlns:x=&quot;http://schemas.microsoft.com/winfx/2006/xaml&quot;<br />
                                Title=&quot;Data Contexts Demo&quot; Height=&quot;300&quot; Width=&quot;300&quot;&gt;<br />
                                &lt;Grid Name=&quot;grid&quot; Height=&quot;219&quot; Width=&quot;178&quot;&gt;<br />
                                &lt;TextBlock Height=&quot;16&quot; HorizontalAlignment=&quot;Left&quot; VerticalAlignment=&quot;Top&quot;
                                Width=&quot;44&quot; Margin=&quot;0,46,0,0&quot;&gt;Name:&lt;/TextBlock&gt;<br />
                                &lt;TextBox Text=&quot;{Binding Path=Name}&quot; Margin=&quot;44,37,15,0&quot; Height=&quot;25&quot;
                                VerticalAlignment=&quot;Top&quot; /&gt;<br />
                                &lt;TextBlock Margin=&quot;0,86,0,0&quot; Height=&quot;17&quot; VerticalAlignment=&quot;Top&quot;
                                HorizontalAlignment=&quot;Left&quot; Width=&quot;38&quot;&gt;Age:&lt;/TextBlock&gt;<br />
                                &lt;TextBox Text=&quot;{Binding Path=Age}&quot; Margin=&quot;44,78,15,0&quot; Height=&quot;25&quot;
                                VerticalAlignment=&quot;Top&quot; /&gt;<br />
                                &lt;Button Name=&quot;birthdayButton&quot; Click=&quot;birthdayButton_Click&quot;
                                Margin=&quot;44,130,15,0&quot; Height=&quot;41&quot; VerticalAlignment=&quot;Top&quot;&gt;Birthday&lt;/Button&gt;<br />
                                &lt;/Grid&gt;<br />
                                &lt;/Window&gt;<br />
                            </div>
                        </td>
                    </tr>
                </tbody>
            </table>
            C#:
            <table border="1">
                <tbody>
                    <tr>
                        <td>
                            <div class="Code">
                                <pre>namespace DataContexts
{
    ///
<summary>
    /// Interaction logic for DataContextsWindow.xaml
    /// </summary>
    public partial class DataContextsWindow : Window
    {
        Person person = new Person("Dedo Kolio", 200);

        public DataContextsWindow()
        {
            InitializeComponent();
            grid.DataContext = person;
        }

        void birthdayButton_Click(object sender, RoutedEventArgs e)
        {
            // Data binding keeps person and the text boxes synchronized
            ++person.Age;
            MessageBox.Show(
              string.Format(
                "Happy Birthday, {0}, age {1}!",
                person.Name,
                person.Age),
              "Birthday");
        }
    }
    class Person
    {
        string name;
        int age;

        public string Name
        {
            get 
            { 
                return this.name; 
            }
            set
            {
                this.name = value;
            }
        }
        
        public int Age
        {
            get
            {
                return this.age; 
            }
            set
            {
                this.age = value; 
            }
        }

        public Person(string name, int age)
        {
            this.name = name;
            this.age = age;
        }

        public Person() { }
    }
}</pre>
                            </div>
                        </td>
                    </tr>
                </tbody>
            </table>
        </p>
    </div>
    <div>
        <p>
            Binding към други контоли</p>
        <p>
            WPF предоставя възможността да bind-ва за друг елемент чрез друго пропърти на другия
            елемент.
        </p>
        XAML:
        <table border="1">
            <tbody>
                <tr>
                    <td>
                        <div class="Code">
                            &lt;Window x:Class=&quot;BindingToOtherControls.BindingWindow&quot;<br />
                            xmlns=&quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&quot;<br />
                            xmlns:x=&quot;http://schemas.microsoft.com/winfx/2006/xaml&quot;<br />
                            Title=&quot;Binding to Other Controls Demo&quot; Height=&quot;300&quot; Width=&quot;300&quot;&gt;<br />
                            &lt;Grid Name=&quot;grid&quot; Height=&quot;219&quot; Width=&quot;178&quot;&gt;<br />
                            &lt;TextBlock Height=&quot;16&quot; HorizontalAlignment=&quot;Left&quot; VerticalAlignment=&quot;Top&quot;
                            Width=&quot;44&quot; Margin=&quot;0,46,0,0&quot;&gt;Name:&lt;/TextBlock&gt;<br />
                            &lt;TextBox Text=&quot;{Binding Path=Name}&quot; Margin=&quot;44,37,15,0&quot; Height=&quot;25&quot;
                            VerticalAlignment=&quot;Top&quot; FontSize=&quot;18&quot; /&gt;<br />
                            &lt;TextBlock Margin=&quot;0,88,0,0&quot; Height=&quot;15&quot; VerticalAlignment=&quot;Top&quot;
                            HorizontalAlignment=&quot;Left&quot; Width=&quot;38&quot;&gt;Age:&lt;/TextBlock&gt;<br />
                            &lt;TextBox Name=&quot;ageTextBox&quot; Text=&quot;{Binding Path=Age}&quot; Foreground=&quot;Red&quot;
                            Margin=&quot;44,78,15,0&quot; Height=&quot;25&quot; VerticalAlignment=&quot;Top&quot;
                            FontSize=&quot;18&quot; /&gt;<br />
                            &lt;Button Foreground=&quot;{Binding Path=Foreground,ElementName=ageTextBox}&quot;
                            FontSize=&quot;20&quot;<br />
                            Name=&quot;birthdayButton&quot; Click=&quot;birthdayButton_Click&quot; Margin=&quot;44,130,15,0&quot;
                            Height=&quot;41&quot; VerticalAlignment=&quot;Top&quot;&gt;Birthday&lt;/Button&gt;<br />
                            &lt;/Grid&gt;<br />
                            &lt;/Window&gt;<br />
                        </div>
                    </td>
                </tr>
            </tbody>
        </table>
        C#:
        <table border="1">
            <tbody>
                <tr>
                    <td>
                        <div class="Code">
                            <pre>
                namespace BindingToOtherControls
{
    ///
<summary>
    /// Interaction logic for BindingWindow.xaml
    /// </summary>
    public partial class BindingWindow : Window
    {
        Person person = new Person("Dedo Kolio", 200);
        public BindingWindow()
        {
            InitializeComponent();
            grid.DataContext = person;
        }

        void birthdayButton_Click(object sender, RoutedEventArgs e)
        {
            ++person.Age;
            MessageBox.Show(
              string.Format(
                "Happy Birthday, {0}, age {1}!",
                person.Name,
                person.Age),
              "Birthday");
        }
    }
                class Person
    {
        string name;
        int age;

        public string Name
        {
            get
            { 
                return this.name;
            }
            set 
            {
                this.name = value; 
            }
        }
     
        public int Age
        {
            get 
            { 
                return this.age; 
            }
            set 
            {
                this.age = value;
            }
        }

        public Person(string name, int age)
        {
            this.name = name;
            this.age = age;
        }

        public Person() { }
    }}
                
                </pre>
                        </div>
                    </td>
                </tr>
            </tbody>
        </table>
    </div>
    <dir>
        <p>
            Валидацяи на данните.
        </p>
        <p>
            <span>Валидациятя на данните се усъществява чрез validation roles в самия код и делта
                е да се предотврати вкарването на вредна или невярна информация. За да се използва
                валидатор е необходимо да се наследи класа ValidationRole и да се override метода
                Validate. когато потребителя започне да въвежда данни и се устаянови че те са грешни
                тогава се създава инстанция на класа ValidationError. За за се появи опиусание на
                грешката се използва ExceptionValidationeRule и по специоано чрез неговото пропърти
                Message.</span>
        </p>
    </dir>
    <dir>
        <p>
            Binding path syntax
        </p>
        <p>
            <span>Когато се използва припъртито Path="нещо" за подаване на източник на данни в "нещо"-
                може да бъдат дост различни формати.Има няколко начина за binding:<br />
                Path=Property - bind към пропърти от обекта<br />
                Path=OwnerType.AttachedPropery- bind към прикачено dependence пропърти<br />
                Path=Property.SubProperty-bind към пропърти на пропъртито<br />
                Path=Pproperty-bind към индекс<br />
                Path=Property/Property - master details bind<br />
                Path=OwnerType.AttachedProperty- bind към микс от пропъртита.<br />
            </span>
        </p>
    </dir>
    <div>
        <p>
            Релативни източници</p>
        <p>
            <span>Чрез релавивните източници се описва доста добре къде се намира източника на данни.
                Релативните източници могат да бъдат self, findAncestor, Previous </span>
        </p>
    </div>
</asp:Content>
